package com.pethospital.util;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.pethospital.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Date;

@Slf4j
@Component
public class FileUploadUtil {

    @Value("${pet-hospital.upload.path}")
    private String uploadPath;
    
    @Value("${server.port:8080}")
    private String serverPort;
    
    @Value("${server.servlet.context-path:/api}")
    private String contextPath;
    
    // 服务器基础URL，可以在生产环境中配置为实际域名
    private static final String SERVER_BASE_URL = "http://localhost";

    /**
     * 上传文件
     * @param file 文件
     * @param type 文件类型（avatar-头像，pet-宠物照片，chat-聊天图片）
     * @return 文件访问路径
     */
    public String uploadFile(MultipartFile file, String type) {
        if (file.isEmpty()) {
            throw new BusinessException("上传文件不能为空");
        }

        // 原始文件名
        String originalFilename = file.getOriginalFilename();
        if (StrUtil.isBlank(originalFilename)) {
            throw new BusinessException("文件名不能为空");
        }

        // 文件后缀
        String suffix = FileUtil.extName(originalFilename);
        // 新文件名
        String fileName = IdUtil.fastSimpleUUID() + "." + suffix;

        // 按日期和类型创建目录
        String dateDir = DateUtil.format(new Date(), "yyyyMMdd");
        String typePath = StrUtil.isBlank(type) ? "other" : type;
        
        // 确保路径格式正确，处理可能的相对路径
        String filePath = new File(uploadPath).getAbsolutePath() + File.separator + typePath + File.separator + dateDir + File.separator;
        filePath = filePath.replace('\\', '/'); // 统一使用正斜杠
        
        log.info("文件保存路径: {}", filePath);

        // 创建目录
        File dir = new File(filePath);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        // 保存文件
        try {
            File targetFile = new File(filePath + fileName);
            file.transferTo(targetFile);
            log.info("文件保存成功: {}", targetFile.getAbsolutePath());
            
            // 构建访问的相对路径（用于URL访问）
            String relativePath = "/uploads/" + typePath + "/" + dateDir + "/" + fileName;
            
            // 构建完整的文件访问URL
            String fullUrl = SERVER_BASE_URL + ":" + serverPort + contextPath + relativePath;
            
            log.info("文件访问URL: {}", fullUrl);
            
            // 返回完整的文件访问URL
            return fullUrl;
        } catch (IOException e) {
            log.error("文件上传失败", e);
            throw new BusinessException("文件上传失败: " + e.getMessage());
        }
    }

    /**
     * 删除文件
     * @param filePath 文件路径
     * @return 是否删除成功
     */
    public boolean deleteFile(String filePath) {
        if (StrUtil.isBlank(filePath)) {
            return false;
        }
        
        // 从完整URL中提取相对路径
        String relativePath = filePath;
        if (filePath.contains("/uploads/")) {
            relativePath = filePath.substring(filePath.indexOf("/uploads/"));
        }
        
        // 去掉路径前缀
        if (relativePath.startsWith("/uploads/")) {
            // 获取physical path，处理相对路径
            String physicalPath = new File(uploadPath).getAbsolutePath() + File.separator + relativePath.substring(9);
            physicalPath = physicalPath.replace('\\', '/'); // 统一使用正斜杠
            
            log.info("尝试删除文件: {}", physicalPath);
            
            File file = new File(physicalPath);
            if (file.exists() && file.isFile()) {
                boolean deleted = file.delete();
                log.info("文件删除结果: {}", deleted ? "成功" : "失败");
                return deleted;
            } else {
                log.warn("要删除的文件不存在: {}", physicalPath);
            }
        }
        
        return false;
    }
} 